package com.jx.service.impl;

import com.jx.dao.CategoryMapper;
import com.jx.pojo.Category;
import com.jx.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 获取分类数据
     *
     * @return
     */
    @Override
    public List<Category> getCategoryList() {
        // 查询所有分类
        List<Category> categoryList = categoryMapper.getCategoryList();
        // 查询所有一级分类
        List<Category> categories = categoryList.stream().filter(category -> category.getParentId() == 0) // 过滤出所有的一级分类
                .map(category -> {  // 为所有一级分类设置children属性，即二级分类
                    category.setCategoryChild(getChildren(category, categoryList));
                    return category;
                }).collect(Collectors.toList()); // 将所有的一级分类重新组装成List
        return categories;
    }

    //递归查找所有菜单的子菜单
    private List<Category> getChildren(Category root, List<Category> all) {
        List<Category> children = all.stream()
                // 过滤出当前分类的所有子分类
                .filter(Category -> Category.getParentId().equals(root.getCategoryId()))
                // 为当前分类设置子分类
                .map(Category -> {
                    Category.setCategoryChild(getChildren(Category, all));
                    return Category;
                }).collect(Collectors.toList());
        return children;

        /**
         *
         *   getChildren(一级分类，所有分类数据) {
         *       所有分类数据.filter过滤出所有的二级分类
         *          循环为所有二级分类设置子分类
         *              getChildren(二级分类，所有分类数据) {
         *                  所有分类数据.filter过滤出所有三级分类
         *                      循环为所有三级分类设置子分类
         *                          getChildren(二级分类，所有分类数据) -> NULL
     *                          返回三级分类
 *                          返回二级分类
*
         *              }
         *   }
         *
         *
         *
         */
    }

}
